#include <iostream>  
using namespace std;

//使用宏定义的缺陷
#define MAX(a, b) a > b ? a : b

void test1(){
	int a = 5, b = 2;
	int c = MAX(a, b) + 2;
	int d = (a > b ? a : b) + 2;
	cout << c << endl << d << endl;
}


//函数定义为inline，即:内联函数  
inline string dbtest(int i) 
{  
	return (i % 2 > 0) ? "奇" : "偶";
}   
  
int main()  
{  
	test1();// 两个结果不一致
	
	cout << "================" << endl;
	
	int i = 0;  
	for (i=1; i < 100; i++) 
	{  
		cout << "i:" << i << "	奇偶性: " << dbtest(i) << endl;    
	}  
}
/*
	上面的例子就是标准的内联函数的用法，
	使用inline修饰带来的好处我们表面看不出来，
	其实在内部的工作就是在每个for循环的内部任何调用dbtest(i)的地方都换成了 (i%2>0)?“奇”:"偶"
	这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。
*/


/*
	1、关键字inline 必须与函数定义体放在一起才能使函数成为内联，
		仅将inline 放在函数声明前面不起任何作用。
	
	如下风格的函数Foo 不能成为内联函数：
*/
inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y){ // 无法成为内敛函数
	
}

/*
	2、inline的使用是有所限制的
	inline只适合代码简单的函数数使用，不能包含复杂的结构控制语句例如while、switch、异常抛出
	并且内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。
*/
	
/*
	3、内联是以代码膨胀（复制）为代价，仅仅省去了函数调用的开销，从而提高函数的执行效率。
	如果执行函数体内代码的时间，相比于函数调用的开销较大，那么效率的收获会很少。
	另一方面，每一处内联函数的调用都要复制代码，将使程序的总代码量增大，消耗更多的内存空间。
*/
	
/*
	4、对于内联函数，inline关键字不是必须的
	没有inline关键字，编译器可能也会把一个函数当成 内联函数
	有inline关键字，编译器也可能把函数当成 普通函数
*/